package pl.edu.mimuw.mas.agent.behaviour.helicopter.verification;

import jade.core.AID;
import jade.lang.acl.ACLMessage;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import pl.edu.mimuw.mas.agent.HelicopterAgent;
import pl.edu.mimuw.mas.agent.behaviour.MutableTimedBehaviour;
import pl.edu.mimuw.mas.util.Move;
import pl.edu.mimuw.mas.util.Position;
import pl.edu.mimuw.mas.util.PositionHelper;
import pl.edu.mimuw.mas.util.Time;

/**
 * Zachowanie pozawlające na zweryfikowanie czy w okolicy danej pozycji jest
 * łoś. Agent leci we wskazane miejsce i odsyła informację czy widoczny jest łoś.
 */
public class VerifyBehaviour extends MutableTimedBehaviour {
	private static final long serialVersionUID = -6995645237646686832L;
	private final Logger logger = LoggerFactory.getLogger(getClass());

	private final Position dest;
	private final AID customer;

	public VerifyBehaviour(HelicopterAgent agent, AID customer, Position dest) {
		super(agent, Time.HELICOPTER_STEP);
		this.dest = dest;
		this.customer = customer;

		agent.setVerifyColor();
	}

	protected void onTick() {
		HelicopterAgent ha = (HelicopterAgent) myAgent;

		if (!ha.getPosition().equals(dest)) {
			int vx = dest.x - ha.getPosition().x;
			int vy = dest.y - ha.getPosition().y;
			int max = Math.max(Math.abs(vx), Math.abs(vy));

			PositionHelper.fly(ha, new Move((int) Math.round((double) vx / max), (int) Math.round((double) vy / max)));
		} else {
			ACLMessage msg = new ACLMessage(ACLMessage.DISCONFIRM);
			if (PositionHelper.verifyDeer(ha.getPosition())) {
				msg.setPerformative(ACLMessage.CONFIRM);
				logger.info("{}: Potwierdzam obecność łosia",ha.getName());
			}

			msg.setConversationId(HelicopterAgent.HELICOPTER_VERIFY_CONV);
			msg.addReceiver(customer);
			ha.send(msg);

			//
			// Koniec - teraz patroluj
			//
			
			stop();
			
			ha.doPatrol();
		}
	}
}
